from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
import sys
import math

windowId = -1
ESCAPE = '\033'

WIDTH = 800
HEIGHT = 600
DISTANCIA_OBSERVADOR = -15
hombro = 0
codo = 0
ejeX = 0
ejeY = 0



def InitGL():
    """
    glClearColor(1.0, 1.0, 1.0, 0.5)
    glClearDepth(1.0)
    glDepthFunc(GL_LESS)
    glEnable(GL_DEPTH_TEST)
    glShadeModel(GL_SMOOTH)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45.0, float(width)/float(height), 0.1, 100.0)
    glMatrixMode(GL_MODELVIEW)
    """
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glShadeModel (GL_FLAT);

"""
def ReSizeGLScene(width, height):
    if height == 0:
        height = 1
    glViewport(0, 0, width, height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45.0, float(width)/float(height), 0.1, 100.0)
    glMatrixMode(GL_MODELVIEW)
"""

def makeCylinderX(centroX, centroY, centroZ, radio, altura):
    i = 0
    j = 0

    glBegin(GL_TRIANGLE_STRIP)
    glVertex3f(centroX,centroY,centroZ)
    while i<=altura:
        while j<=2*math.pi+1:
            glVertex3f(centroX+i, radio*(math.sin(j)),radio*(math.cos(j)))
            j = j + 0.1
        j = 0
        i = i + 0.05
    glEnd()

def dibujaBrazo():
    glTranslatef (-1.0, 0.0, 0.0);
    glRotatef (hombro, 0.0, 0.0, 1.0);
    glTranslatef (1.0, 0.0, 0.0);
    glPushMatrix();
    #glScalef (2.0, 0.4, 1.0);

    
    #glutSolidTorus(1.0,1.0,1,1)
    #glutWireCube(1.0);
    #gluCylinder(gluNewQuadric(), 10,10,10,10,10)
    makeCylinderX(-1,0,0,0.5,2)
    
    #glutWireCube(1.0);
    glPopMatrix();
    glTranslatef (1.0, 0.0, 0.0);
    glRotatef(codo, 0.0, 0.0, 1.0);
    glTranslatef (1.0, 0.0, 0.0);
    glPushMatrix();
    #glScalef (2.0, 0.4, 1.0);
    makeCylinderX(-1,0,0,0.5,2)
    #glutWireCube (1.0);
    glPopMatrix();
    
    
def reshape(w, h):
   glViewport (0, 0, w, h);
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   gluPerspective(65.0, w/h, 1.0, 20.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glTranslatef (0.0, 0.0, -5.0);

def DrawGLScene():
    global codo
    global hombro
    global ejeX
    global ejeY
    glClear (GL_COLOR_BUFFER_BIT);

    glPushMatrix();
    glRotatef(ejeX,1.0,0.0,0.0);
    glRotatef(ejeY, 0.0, 1.0, 0.0)

    dibujaBrazo()    
    
    glPopMatrix();

    #  Intercambiamos los b'ufers. Ahora lo visible es lo que acabamos de dibujar.
    glutSwapBuffers()

def keyPressed(*args):
    global hombro
    global codo
    global ejeX
    global ejeY
    key = args[0]
    if key == ESCAPE:
        glutDestroyWindow(windowId)
        sys.exit()
    elif key == 's':
        if hombro < 110:
            hombro = hombro + 2;
            #hombro = (hombro + 5) % 360;
        glutPostRedisplay();
    elif key == 'S':
        if hombro > -85:
            hombro = hombro - 2;
            #hombro = (hombro - 5) % 360;
        glutPostRedisplay();
    elif key == 'e':
        if codo < 150:
            codo = codo + 2;
            #codo = (codo + 5) % 360;
        glutPostRedisplay(); 
    elif key == 'E':
        if codo > 0:
            codo = codo - 2;
            #codo = (codo - 5) % 360;
        glutPostRedisplay();
    elif key == 'x':
        if ejeX < 45:
            ejeX = ejeX + 2;
            #ejeX = (ejeX + 5)%360;
        glutPostRedisplay();
    elif key == 'X':
        if ejeX > -45:
            ejeX = ejeX - 2;
            #ejeX = (ejeX - 5)%360;
        glutPostRedisplay();
    elif key == 'y':
        ejeY = (ejeY - 5)%360;
        glutPostRedisplay();

def main():
    global windowId
    global WIDTH
    global HEIGHT
    glutInit(())
    
	# Mi modo de Display. Por ahora, no importa
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)

	# Tamanio de la ventana.
    glutInitWindowSize(WIDTH, HEIGHT)
    
    windowId = glutCreateWindow("CC52B - Robot Humanoide")

	# Donde queremos que se posicione la ventana al iniciar.
    glutInitWindowPosition(0, 0)

    # Defino la funci'on que se encargar'a de dibujar
    glutDisplayFunc (DrawGLScene)

    # La funci'on cuando el programa este Idle.
    # En un videoJuego, 'este ser'ia el lugar donde actualizo posiciones, calculo puntajes, etc.
    glutIdleFunc(DrawGLScene)

	# La funci'on a llamar cuando cambia el tamanio de la ventana.
    glutReshapeFunc(reshape)
    

    # La funci'on que se encarga de recibir el input desde teclado
    glutKeyboardFunc (keyPressed)

	# Configuramos OpenGL para trabajar al tamanio deseado.
    InitGL()

	# Loop infinito
    glutMainLoop()

print "Hit ESC key to quit."
main()